今天是第 8 天,大家都知道跑迴圈的寫法,像是 for loop、forEach 等等,其中有兩個長得很像的 for..in 與 for...of,一開始很容易搞混,所以今天想跟大家分享這兩者的差別 ~~
假設今天有一陣列
let exArray = [1, 3, 5, 7]
// for...in 回傳 key
for (let i in exArray) {
console.log(i) // "0", "1", "2", "3"
}
// 也可以取 value
for (let i in exArray) {
console.log(exArray[i]) // 1, 3, 5, 7
}
// for...of 回傳 value
for (let i of exArray) {
console.log(i) // 1, 3, 5, 7
}
BUT
如果我增加了屬性名稱的話
exArray.name = 'hi, exArray'
// for...in 會列出自定義屬性 name
for (let i in exArray) {
console.log(i) // "0", "1", "2", "3", "name"
}
for (let i in exArray) {
console.log(exArray[i]) // 1, 3, 5, 7, "hi, exArray"
}
// for...of 不會
for (let i of exArray) {
console.log(i) // 1, 3, 5, 7
}
或是在原型鍊新增 function
// 在原型鍊新增 function
Object.prototype.objCustom = function () {}
Array.prototype.arrCustom = function () {}
let exArray2 = [2, 4, 6]
// for...in 會遍歷到從原型鍊繼承到的屬性
for (let i in exArray2) {
console.log(i) // "0", "1", "2", "arrCustom", "objCustom"
}
for (let i in exArray2) {
console.log(exArray2[i]) // 2, 4, 6, function, function
}
// for...of 不會
for (let i of exArray2) {
console.log(i) // 2, 4, 6
}
所以今天如果使用 iterable object 的話,選擇 for...of 會更適合
假設有一物件
const fruit = {
name: 'apple',
price: 10,
quantity: 200
}
// for...in 回傳 key
for (let key in fruit) {
console.log(key)
}
// 也可以取 value
for (let key in fruit) {
console.log(fruit[key])
}
// for...of 取 value 需要搭配 Object.keys()
for (let key of Object.keys(fruit)) {
console.log(key)
console.log(fruit[key])
}
物件想取 key 的話,使用 for...in 會比 for...of 還簡潔喔!
參考資料:
只是個打字的 - JavaScript中for of和for in的差別
javascript總for of和for in的區別?
MDN for...in、for...of文章同步更新於 medium